package com.example.juc.kingdom_adventures.term3;

import org.junit.Test;

public class Client {
    private int number = 0;
    private final Object lock = new Object();

    /**
     * 现在读取时不需要获取钥匙，所以读取时可以直接将主内存中的 number 值拷贝到自己的工作内存。而此时有可能存在线程正在写入值，这就会导致读取线程无法读到写入后的最新值
     */
    private void read() {
        System.out.println("number = " + number);
    }

    private void write(int change) {
        synchronized (lock) {
            number += change;
            System.out.println("写入 " + number);
        }
    }

    @Test
    public void test() throws InterruptedException {
        // 开启一个线程写入 100 次 number
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                write(1);
            }
        }).start();

        // 开启一个线程读取 100 次 number
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                read();
            }
        }).start();

        // 睡眠一秒保证线程执行完成
        Thread.sleep(1000);
    }
}

